// valueCtx示例
package main

import (
	"context"
	"fmt"
	"time"
)

func HandelRequest(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("HandelRequest Done.")
			return
		default:
			fmt.Println("HandelRequest running, parameter: ", ctx.Value("parameter"))
			time.Sleep(2 * time.Second)
		}
	}
}

func main() {
	ctx := context.WithValue(context.Background(), "parameter", "1")
	go HandelRequest(ctx)

	time.Sleep(10 * time.Second)
}

// timerCtx 示例
// package main

// import (
// 	"context"
// 	"fmt"
// 	"time"
// )

// func HandelRequest(ctx context.Context) {
// 	go WriteRedis(ctx)
// 	go WriteDatabase(ctx)
// 	for {
// 		select {
// 		case <-ctx.Done():
// 			fmt.Println("HandelRequest Done.")
// 			return
// 		default:
// 			fmt.Println("HandelRequest running")
// 			time.Sleep(2 * time.Second)
// 		}
// 	}
// }

// func WriteRedis(ctx context.Context) {
// 	for {
// 		select {
// 		case <-ctx.Done():
// 			fmt.Println("WriteRedis Done.")
// 			return
// 		default:
// 			fmt.Println("WriteRedis running")
// 			time.Sleep(2 * time.Second)
// 		}
// 	}
// }

// func WriteDatabase(ctx context.Context) {
// 	for {
// 		select {
// 		case <-ctx.Done():
// 			fmt.Println("WriteDatabase Done.")
// 			return
// 		default:
// 			fmt.Println("WriteDatabase running")
// 			time.Sleep(2 * time.Second)
// 		}
// 	}
// }

// func main() {
// 	ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
// 	go HandelRequest(ctx)

// 	time.Sleep(10 * time.Second)
// }

// cancelCtx 示例
// package main

// import (
// 	"context"
// 	"fmt"
// 	"time"
// )

// func HandelRequest(ctx context.Context) {
// 	go WriteRedis(ctx)
// 	go WriteDatabase(ctx)
// 	for {
// 		select {
// 		case <-ctx.Done():
// 			fmt.Println("HandelRequest Done.")
// 			return
// 		default:
// 			fmt.Println("HandelRequest running")
// 			time.Sleep(2 * time.Second)
// 		}
// 	}
// }

// func WriteRedis(ctx context.Context) {
// 	for {
// 		select {
// 		case <-ctx.Done():
// 			fmt.Println("WriteRedis Done.")
// 			return
// 		default:
// 			fmt.Println("WriteRedis running")
// 			time.Sleep(2 * time.Second)
// 		}
// 	}
// }

// func WriteDatabase(ctx context.Context) {
// 	for {
// 		select {
// 		case <-ctx.Done():
// 			fmt.Println("WriteDatabase Done.")
// 			return
// 		default:
// 			fmt.Println("WriteDatabase running")
// 			time.Sleep(2 * time.Second)
// 		}
// 	}
// }

// func main() {
// 	ctx, cancel := context.WithCancel(context.Background())
// 	go HandelRequest(ctx)

// 	time.Sleep(5 * time.Second)
// 	fmt.Println("It's time to stop all sub goroutines!")
// 	cancel()

// 	//Just for test whether sub goroutines exit or not
// 	time.Sleep(5 * time.Second)
// }
